import UIKit

// 输入窗口回调
protocol InputBoxCallback: NSObjectProtocol {
    func onInputBoxCancel()                     // 用户单击"取消"按钮事件
    func onInputBoxOK(_ intValue: Int)          // 用户单击"确定"按钮事件（返回整数值）
    func onInputBoxOK(_ stringValue: String)    // 用户单击"确定"按钮事件（返回字符串）
}

// 输入窗口
class InputBox: NSObject, UITextFieldDelegate {
    private let CANCEL = "取消"
    private let OK = "确定"
    private let mAlertController: UIAlertController // 对话框控制者
    private let mViewController: UIViewController   // 视图控制者
    
    /**
     * 构造方法。
     * @param callback          回调
     * @param displayValue      编辑框上显示的默认值
     * @param maxValue          允许输入的最大值
     * @param minValue          允许输入的最小值
     * @param tipText           提示文字
     * @param viewController    视图控制者
     */
    public init(_ callback: InputBoxCallback, displayValue: Int?, maxValue: Int?, minValue: Int?, tipText: String?, viewController: UIViewController) {
        // 初始化成员
        mAlertController = UIAlertController(title: nil, message: tipText, preferredStyle: .alert)
        mViewController = viewController
        super.init()
        
        // 添加"取消"按钮
        let buttonCancel = UIAlertAction(title: CANCEL, style: .cancel, handler: {
            _ in
            callback.onInputBoxCancel()
        })
        mAlertController.addAction(buttonCancel)
        
        // 添加"确定"按钮
        let buttonOK = UIAlertAction(title: OK, style: .default, handler: {
            _ in
            let text = self.mAlertController.textFields![0].text!
            if text.isEmpty {
                return
            }
            let value = Int(text)!
            if minValue != nil && maxValue != nil {
                if value < minValue! || value > maxValue! {
                    Toast.makeText(self.mViewController.view, text: "输入的内容超出了允许范围，请重新输入。", duration: Toast.LENGTH_LONG).show()
                    return
                }
            }
            callback.onInputBoxOK(value)
        })
        mAlertController.addAction(buttonOK)
        
        // 添加编辑框
        mAlertController.addTextField(configurationHandler: {
            textField in
            textField.delegate = self
            textField.keyboardType = .numberPad
            if displayValue != nil {
                textField.text = String(displayValue!)
                textField.selectAll(nil)
            }
        })
    }
    
    /**
     * 构造方法。
     * @param callback          回调
     * @param tipText           提示文字
     * @param viewController    视图控制者
     */
    public init(_ callback: InputBoxCallback, tipText: String?, viewController: UIViewController) {
        // 初始化成员
        mAlertController = UIAlertController(title: nil, message: tipText, preferredStyle: .alert)
        mViewController = viewController
        super.init()
        
        // 添加"取消"按钮
        let cancel = NSLocalizedString(CANCEL, tableName: "Main", comment: "")
        let buttonCancel = UIAlertAction(title: cancel, style: .cancel, handler: {
            _ in
            callback.onInputBoxCancel()
        })
        mAlertController.addAction(buttonCancel)
        
        // 添加"确定"按钮
        let buttonOK = UIAlertAction(title: OK, style: .default, handler: {
            _ in
            let text = self.mAlertController.textFields![0].text!
            if text.isEmpty {
                callback.onInputBoxCancel()
            } else {
                callback.onInputBoxOK(text)
            }
        })
        mAlertController.addAction(buttonOK)
        
        // 添加编辑框
        mAlertController.addTextField(configurationHandler: {
            textField in
            textField.delegate = self
        })
    }
    
    /**
     * 显示。
     */
    public func show() {
        mViewController.present(mAlertController, animated: true)
    }
}
